﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using blacksoft.Models;
using blacksoft.Constantes;

namespace blacksoft.Controllers
{
    public class MovimientoController : Controller
    {
        private inf245travelbusEntities db = new inf245travelbusEntities();

        private ActionResult ValidarPermiso()
        {
            //NO ESTOY LOGUEADO EN EL SISTEMA
            if (Session["Permisos"] == null)
            {
                TempData["LogueatePrimero"] = SystemField.NO_LOGUEADO;
                return RedirectToAction("Index", "ValidarLogin");
            }
            //ESTOY LOGUEADO PERO NO TENGO PERMISO PARA REALIZAR ESTA ACCION
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.ADMINISTRACION))
            {
                TempData["SinPermiso"] = SystemField.SIN_PERMISO;
                return RedirectToAction("Index", "MainPageEmployes");
            }
            return null;
        }

        private class ItemListaChoferes
        {
            public int id { get; set; }
            public string nombre { get; set; }

            public ItemListaChoferes(int id, string nombre)
            {
                this.id = id;
                this.nombre = nombre;
            }
        }
        private List<ItemListaChoferes> obtenerChoferes()
        {
            var choferQry = from c in db.Persona
                            where c.Estado != "AN" && c.CargoPersonal == "Chofer"
                            select c;
            List<ItemListaChoferes> choferLst = new List<ItemListaChoferes>();
            foreach (var chofer in choferQry)
            {
                choferLst.Add(new ItemListaChoferes(chofer.IDPersona, chofer.IDPersona + " " + chofer.Nombre + " " + chofer.ApellidoPaterno + " " +
                    chofer.ApellidoMaterno));
            }
            return choferLst;
        }

        private class ItemListaViajes
        {
            public int id_viaje { get; set; }
            public string ruta { get; set; }

            public ItemListaViajes(int id_viaje, string ruta)
            {
                this.id_viaje = id_viaje;
                this.ruta = ruta;
            }
        }
        private List<ItemListaViajes> obtenerViajes()
        {
            var viajeQry = from v in db.ProgramacionViaje
                           where v.Estado != "AN"
                           select v;
            List<ItemListaViajes> viajeLst = new List<ItemListaViajes>();
            foreach (var viaje in viajeQry)
            {
                viajeLst.Add(new ItemListaViajes(viaje.IDProgramacionViaje, viaje.Ruta_x_UnidadTransporte.Ruta.Origen + " - " + viaje.Ruta_x_UnidadTransporte.Ruta.Destino));
            }
            return viajeLst;
        }

        private class TipoMovimiento
        {
            public int valor { get; set; }
            public string nombre { get; set; }

            public TipoMovimiento(int valor, string nombre)
            {
                this.valor = valor;
                this.nombre = nombre;
            }
        }
        private List<TipoMovimiento> tipos_movimiento = new List<TipoMovimiento> { new TipoMovimiento(2, "Entrada"), new TipoMovimiento(1, "Salida"), new TipoMovimiento(3, "Pérdida") };

        // GET: /Movimiento/
        public ActionResult Index(string producto, string tipo, string viaje, string proveedor, string fecha_desde, string fecha_hasta)
        {
            ActionResult permiso=ValidarPermiso();
            if (permiso != null) return permiso;
            //lista de tipos de movimiento para el filtro
            ViewBag.tipo = new SelectList(tipos_movimiento, "valor", "nombre");
            //Query de la lista de productos registrados para poder filtrar
            ViewBag.producto = new SelectList(db.Producto.Where(p=>p.Estado!="AN").OrderBy(p=>p.Nombre),"IDProducto","Nombre");
            //Query de la lista de viajes registrados para poder filtrar
            ViewBag.viaje = new SelectList(obtenerViajes(),"id_viaje","ruta");
            ViewBag.proveedor = new SelectList(db.Persona.Where(p => p.Estado != "AN" && p.TipoPersona == 1),"IDPersona","RazonSocial"); //tipo 1 = proveedor
            
            var movimiento = db.Movimiento.Include(m => m.Almacen).Include(m => m.ProgramacionViaje).Where(m => m.Almacen.Producto.Estado != "AN" && m.ProgramacionViaje.Estado != "AN");
            //Si NO tiene permiso Global
            if (!PerfilsController.TienePermiso((int)Session["Permisos"], PerfilsController.GLOBAL))
            {
                //Solo se muestran los registros de la terminal
                int terminal = (int)Session["IDTerminal"];
                movimiento = movimiento.Where(m=>m.Almacen.IDTerminal == terminal);
            }
            //Filtro del listado
            if (!String.IsNullOrEmpty(producto))
            {
                movimiento = movimiento.Where(m => m.Almacen.Producto.IDProducto.ToString() == producto);
            }
            if (!String.IsNullOrEmpty(tipo))
            {
                movimiento = movimiento.Where(m => m.Tipo.ToString() == tipo);
            }
            if (!String.IsNullOrEmpty(viaje))
            {
                movimiento = movimiento.Where(m => m.ProgramacionViaje.IDProgramacionViaje.ToString() == viaje);
            }
            if (!String.IsNullOrEmpty(proveedor))
            {
                movimiento = movimiento.Where(m => m.Almacen.Producto.Producto_x_Proveedor.Any(p => p.IDPersona.ToString() == proveedor));
            }
            try
            {
                if (!String.IsNullOrEmpty(fecha_desde))
                {
                    DateTime fecha = Convert.ToDateTime(fecha_desde);
                    movimiento = movimiento.Where(i => (i.Fecha.Year > fecha.Year) || (i.Fecha.Year == fecha.Year && i.Fecha.Month > fecha.Month)
                        || (i.Fecha.Year == fecha.Year && i.Fecha.Month == fecha.Month && i.Fecha.Day > fecha.Day)
                        || (i.Fecha.Year == fecha.Year && i.Fecha.Month == fecha.Month && i.Fecha.Day == fecha.Day && i.Fecha.Hour > fecha.Hour)
                        || (i.Fecha.Year == fecha.Year && i.Fecha.Month == fecha.Month && i.Fecha.Day == fecha.Day && i.Fecha.Hour == fecha.Hour && i.Fecha.Minute > fecha.Minute)
                        || (i.Fecha.Year == fecha.Year && i.Fecha.Month == fecha.Month && i.Fecha.Day == fecha.Day && i.Fecha.Hour == fecha.Hour && i.Fecha.Minute == fecha.Minute && i.Fecha.Second >= i.Fecha.Second));
                }
                if (!String.IsNullOrEmpty(fecha_hasta))
                {
                    DateTime fecha = Convert.ToDateTime(fecha_hasta);
                    movimiento = movimiento.Where(i => (i.Fecha.Year < fecha.Year) || (i.Fecha.Year == fecha.Year && i.Fecha.Month < fecha.Month)
                        || (i.Fecha.Year == fecha.Year && i.Fecha.Month == fecha.Month && i.Fecha.Day < fecha.Day)
                        || (i.Fecha.Year == fecha.Year && i.Fecha.Month == fecha.Month && i.Fecha.Day == fecha.Day && i.Fecha.Hour < fecha.Hour)
                        || (i.Fecha.Year == fecha.Year && i.Fecha.Month == fecha.Month && i.Fecha.Day == fecha.Day && i.Fecha.Hour == fecha.Hour && i.Fecha.Minute < fecha.Minute)
                        || (i.Fecha.Year == fecha.Year && i.Fecha.Month == fecha.Month && i.Fecha.Day == fecha.Day && i.Fecha.Hour == fecha.Hour && i.Fecha.Minute == fecha.Minute && i.Fecha.Second <= i.Fecha.Second));
                }
            }
            catch (Exception)
            {
                TempData["index"] = "Ocurrió un error inesperado. Intentelo otra vez.";
                return RedirectToAction("Index");
            }
            return View(movimiento.ToList());
        }

        // GET: /Movimiento/Details/5
        public ActionResult Details(int? id)
        {
            ActionResult permiso = ValidarPermiso();
            if (permiso != null) return permiso;
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Movimiento movimiento = db.Movimiento.Find(id);
            if (movimiento == null)
            {
                return HttpNotFound();
            }
            return View(movimiento);
        }

        // GET: /Movimiento/Create
        /*public ActionResult Create()
        {
            ViewBag.IdAlmacen = new SelectList(db.Almacen, "IdAlmacen", "IdAlmacen");
            ViewBag.IDProgramacionViaje = new SelectList(db.ProgramacionViaje, "IDProgramacionViaje", "Descripcion");
            return View();
        }

        // POST: /Movimiento/Create
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include="IDProgramacionViaje,Cantidad,IdAlmacen,IdMovimiento,Tipo,Fecha")] Movimiento movimiento)
        {
            if (ModelState.IsValid)
            {
                db.Movimiento.Add(movimiento);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            ViewBag.IdAlmacen = new SelectList(db.Almacen, "IdAlmacen", "IdAlmacen", movimiento.IdAlmacen);
            ViewBag.IDProgramacionViaje = new SelectList(db.ProgramacionViaje, "IDProgramacionViaje", "Descripcion", movimiento.IDProgramacionViaje);
            return View(movimiento);
        }

        // GET: /Movimiento/Edit/5
        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Movimiento movimiento = db.Movimiento.Find(id);
            if (movimiento == null)
            {
                return HttpNotFound();
            }
            ViewBag.IdAlmacen = new SelectList(db.Almacen, "IdAlmacen", "IdAlmacen", movimiento.IdAlmacen);
            ViewBag.IDProgramacionViaje = new SelectList(db.ProgramacionViaje, "IDProgramacionViaje", "Descripcion", movimiento.IDProgramacionViaje);
            return View(movimiento);
        }

        // POST: /Movimiento/Edit/5
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include="IDProgramacionViaje,Cantidad,IdAlmacen,IdMovimiento,Tipo,Fecha")] Movimiento movimiento)
        {
            if (ModelState.IsValid)
            {
                db.Entry(movimiento).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.IdAlmacen = new SelectList(db.Almacen, "IdAlmacen", "IdAlmacen", movimiento.IdAlmacen);
            ViewBag.IDProgramacionViaje = new SelectList(db.ProgramacionViaje, "IDProgramacionViaje", "Descripcion", movimiento.IDProgramacionViaje);
            return View(movimiento);
        }

        // GET: /Movimiento/Delete/5
        public ActionResult Delete(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Movimiento movimiento = db.Movimiento.Find(id);
            if (movimiento == null)
            {
                return HttpNotFound();
            }
            return View(movimiento);
        }

        // POST: /Movimiento/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(int id)
        {
            Movimiento movimiento = db.Movimiento.Find(id);
            db.Movimiento.Remove(movimiento);
            db.SaveChanges();
            return RedirectToAction("Index");
        }*/

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}
